from nicegui import ui
import plotly.graph_objs as go

# 创建一个空的三维散点图
scatter_3d_fig = go.Figure(data=[go.Scatter3d(x=[0], y=[0], z=[0], mode='markers')])

# 创建输入框和按钮
with ui.column():
    x_input_3d = ui.number(label='X 值', value=0)
    y_input_3d = ui.number(label='Y 值', value=0)
    z_input_3d = ui.number(label='Z 值', value=0)  # 新增的 Z 值输入框
    add_point_button_3d = ui.button('加入该点')
    delete_point_button_3d = ui.button('删除输入点')  # 修改为删除输入点

# 创建 Plotly 图表，并放大尺寸
plot_3d = ui.plotly(scatter_3d_fig).classes('w-full h-120')  # 增加高度为 384px

# 定义按钮点击事件 - 加入点
def add_point_3d():
    x = x_input_3d.value
    y = y_input_3d.value
    z = z_input_3d.value

    # 更新现有的 Scatter3d 对象的 x, y, z 数据
    scatter_3d_fig.data[0].x = list(scatter_3d_fig.data[0].x) + [x]
    scatter_3d_fig.data[0].y = list(scatter_3d_fig.data[0].y) + [y]
    scatter_3d_fig.data[0].z = list(scatter_3d_fig.data[0].z) + [z]

    # 手动更新图表
    plot_3d.update()

# 定义按钮点击事件 - 删除输入点
def delete_point_3d():
    x = x_input_3d.value
    y = y_input_3d.value
    z = z_input_3d.value

    # 获取当前所有点的数据
    x_data = list(scatter_3d_fig.data[0].x)
    y_data = list(scatter_3d_fig.data[0].y)
    z_data = list(scatter_3d_fig.data[0].z)

    # 查找与输入值匹配的点
    for i in range(len(x_data) - 1, -1, -1):
        if x_data[i] == x and y_data[i] == y and z_data[i] == z:
            x_data.pop(i)
            y_data.pop(i)
            z_data.pop(i)

    # 更新图表数据
    scatter_3d_fig.data[0].x = x_data
    scatter_3d_fig.data[0].y = y_data
    scatter_3d_fig.data[0].z = z_data

    # 手动更新图表
    plot_3d.update()

# 绑定按钮点击事件
add_point_button_3d.on_click(add_point_3d)
delete_point_button_3d.on_click(delete_point_3d)  # 绑定删除输入点的点击事件

# 启动 NiceGUI 应用
ui.run(port=8083)